package com.android.WiFiQualityMeasurement;

import java.util.Calendar;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.telephony.TelephonyManager;

public class WiFiQualityMeasurementDrawInfoService extends Service implements LocationListener{

    //繰り返し間隔（ミリ秒）
    private final int REPEAT_INTERVAL = 200;
	private final int PING_TIMEOUT = 2000;				// Pingタイムアウト
    private final int PING_INTERVAL = 5000;

    private Handler handler = new Handler();

	private TelephonyManager 	mTelephonyManager;					// Telephonyマネージャー
	private String 				mStringLineType;					// 捕捉回線種別
	private WifiManager 		mWifiManager;						// Wifiマネージャー
	private WifiInfo 			mWifiInfo;							// Wifiインフォ
	private ConnectivityManager	mConManager;						// コネクティビティマネージャ
	private NetworkInfo 		mNetInfo;							// ネットワークインフォ
	private String 				mStringThroughput;					// スループット値
	private String 				mStringElectricFieldStrength;		// 電界強度
	private Calendar 			mCalendar;							// カレンダークラス
	private String 				mStringDayTime;						// 年月日時分秒ミリ秒
	private LocationManager		mLocationManager;					// ロケーションマネージャ
	private String				mStringLatitude;					// 緯度
	private String				mStringLongitude;					// 経度
	private String				mStringBssid;						// BSSID
	private String				mStringMacAddress;					// MacAddress
	private String				mStringModel;						// 端末種別
	private String				mStringSsid;						// SSID
	private String				mStringCareerName;					// キャリア名
	private String				mStringPingResult;					// Ping結果

	private WiFiQualityMeasurementPingAsyncTask mTaskPing;

	private WiFiQualityMeasurementPingAsyncTaskPingInfo mPingInfo;

	private long mPingStart;	// Ping開始時刻

	private Intent				mIntent;							// アクティビティへのデータ渡し

	public static final String ACTION = "WiFiQualityMeasurementDrawInfo Service";

	private Runnable runnable = new Runnable() {
		@Override
		public void run() {
			/* 次回処理をセット */
			handler.postDelayed(this, REPEAT_INTERVAL);

			getState();

			/* 繰り返し処理 */
			long now = System.currentTimeMillis();

			if ( now - mPingStart >= PING_INTERVAL ) {
				mTaskPing = new WiFiQualityMeasurementPingAsyncTask(mPingInfo);
				if(mTaskPing != null)
				{
					String str = "";
					mPingStart = System.currentTimeMillis();
					mTaskPing.execute(str, null, str);
				}
			}

		}
	};


	public void onCreate(){
		super.onCreate();

		mStringPingResult = "";

		mPingStart = 0;

		mPingInfo = new WiFiQualityMeasurementPingAsyncTaskPingInfo();

		mPingInfo.setTimeout(PING_TIMEOUT);

	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);

		// GPS開始
		mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

		if(mLocationManager != null)
		{
			mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, // プロバイダ
													0, // 通知のための最小時間間隔
													0, // 通知のための最小距離間隔
													this); // 位置情報リスナー
		}

		/* 初回実行 */
		handler.postDelayed(runnable, 0);
	}

	@Override
	public void onDestroy() {

		if(mLocationManager != null)
		{
			/* GPS利用の終了 */
			mLocationManager.removeUpdates(this);	// GPS終了
		}


		/* Intentの設定(画面表示クリア) */
		mIntent = new Intent(ACTION);
		if(mIntent != null)
		{
			mIntent.putExtra("LINETYPE", "");
			mIntent.putExtra("CAREERNAME", "");

			mIntent.putExtra("SSID", "");
			mIntent.putExtra("BSSID", "");
			mIntent.putExtra("THROUGHPUT", "");
			mIntent.putExtra("ELECTRICFIELDSTRENGTH", "");

			mIntent.putExtra("MACADDRESS", "");
			mIntent.putExtra("MODEL", "");

			mIntent.putExtra("LATITUDE", "");
			mIntent.putExtra("LONGITUDE", "");
			mIntent.putExtra("DAYTIME", "");
			mIntent.putExtra("PINGRESULT", "");

			sendBroadcast(mIntent);
		}

		handler.removeCallbacks(runnable);
		runnable = null;

		super.onDestroy();

	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO 自動生成されたメソッド・スタブ
		return null;
	}

	private void getState() {
		/* TelephonyManagerの取得 */
		mTelephonyManager = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE));

		/* WifiManagerの取得 */
		mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);

		/* WifiManagerの取得判定 */
		if(mWifiManager != null)
		{
			/* WifiManager取得可の場合 */
			/* Wifi状態の取得 */
			int wifiState = mWifiManager.getWifiState();
			switch (wifiState) {
			case WifiManager.WIFI_STATE_ENABLED:
				/* Wifiの状態が有効の場合 */
				break;
			case WifiManager.WIFI_STATE_DISABLING:
			case WifiManager.WIFI_STATE_DISABLED:
			case WifiManager.WIFI_STATE_UNKNOWN:
			case WifiManager.WIFI_STATE_ENABLING:
				/* Wifiの状態が有効以外の場合 */
				mStringThroughput = "";
				mStringElectricFieldStrength = "";
				mStringBssid = "";
				mStringMacAddress = "";
				mStringSsid = "";
				break;
			}

			/* WifiInfoを取得 */
			mWifiInfo = mWifiManager.getConnectionInfo();
		}
		else
		{
			/* WifiManager取得不可の場合 */

			/* WifiInfoの参照をクリア */
			mWifiInfo = null;
			mStringThroughput = "";
			mStringElectricFieldStrength = "";
			mStringBssid = "";
			mStringMacAddress = "";
			mStringSsid = "";
		}

		mCalendar = Calendar.getInstance();

		/* ConnectivityManagerの取得 */
		mConManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

		/* ConnectivityManagerの取得判定 */
		if(mConManager != null)
		{
			/* ConnectivityManager取得可の場合 */
			/* NetworkInfoを取得 */
			mNetInfo = mConManager.getActiveNetworkInfo();
		} else {
			/* ConnectivityManager取得不可の場合 */
			/* NetworkInfoの参照をクリア */
			mNetInfo = null;
		}

		/* NetworkInfoの取得判定 */
		if(mNetInfo != null)
		{
			/* NetworkInfo取得可の場合 */

			/* 回線種別判定 */
			if(mNetInfo.getType() == ConnectivityManager.TYPE_WIFI)
			{
				/* 回線種別にWiFiの場合 */

				/* 回線種別にWiFiを設定 */
				mStringLineType = "WiFi";


				/* WifiInfoの取得判定 */
				if(mWifiInfo != null)
				{
					/* WifiInfo取得可の場合 */

					/* WiFi情報の設定 */
					mStringThroughput = Integer.toString(mWifiInfo.getLinkSpeed());
					mStringElectricFieldStrength = Integer.toString(mWifiInfo.getRssi());
					mStringBssid = mWifiInfo.getBSSID();
					mStringMacAddress = mWifiInfo.getMacAddress();
					mStringSsid = mWifiInfo.getSSID();
				}else{
					/* WifiInfo取得可の場合 */

					/* WiFi情報のクリア */
					mStringThroughput = "";
					mStringElectricFieldStrength = "";
					mStringBssid = "";
					mStringMacAddress = "";
					mStringSsid = "";
				}

				/* TelephonyManagerの取得判定 */
				if(mTelephonyManager != null)
				{
					/* キャリア名の設定 */
					mStringCareerName = mTelephonyManager.getNetworkOperatorName();
				}
				else
				{
					/* キャリア名のクリア */
					mStringCareerName = "";
				}
			}
			/* 電話回線の場合 */
			else if(mNetInfo.getType() == ConnectivityManager.TYPE_MOBILE)
			{
				/* TelephonyManagerの取得判定 */
				if(mTelephonyManager != null)
				{
					// 回線種別
					mStringLineType = "3G";

					// キャリア名
					mStringCareerName = mTelephonyManager.getNetworkOperatorName();
					mStringThroughput = "";
					mStringElectricFieldStrength = "";
					mStringBssid = "";
					mStringMacAddress = "";
					mStringSsid = "";
				}
			}
			else
			{
				// その他WiMaxなど
				mStringLineType = "Other";

				// キャリア名
				mStringCareerName = "";
			}
		}
		else
		{
			/* NetworkInfo取得不可(通信回線がすべて無効)の場合 */
			/* 回線種別に無効を設定 */
			mStringLineType = "Desabled";

			/*キャリア名をクリア */
			mStringCareerName = "";
		}

		if(mCalendar != null)
		{
			mStringDayTime = (
			 		/*Integer.toString(*/String.format("%02d",mCalendar.get(Calendar.YEAR)) + "/" +
					/*Integer.toString(*/String.format("%02d",mCalendar.get(Calendar.MONTH)+1) + "/" +
					/*Integer.toString(*/String.format("%02d",mCalendar.get(Calendar.DAY_OF_MONTH)) + " " +
					/*Integer.toString(*/String.format("%02d",mCalendar.get(Calendar.HOUR_OF_DAY)) + ":" +
					/*Integer.toString(*/String.format("%02d",mCalendar.get(Calendar.MINUTE))
					);
		}
		mStringModel = Build.MODEL;

		/* Intentの設定 */
		mIntent = new Intent(ACTION);
		if(mIntent != null)
		{
			mIntent.putExtra("LINETYPE", mStringLineType);
			mIntent.putExtra("CAREERNAME", mStringCareerName);

			mIntent.putExtra("SSID", mStringSsid);
			mIntent.putExtra("BSSID", mStringBssid);
			mIntent.putExtra("THROUGHPUT", mStringThroughput);
			mIntent.putExtra("ELECTRICFIELDSTRENGTH", mStringElectricFieldStrength);

			mIntent.putExtra("MACADDRESS", mStringMacAddress);
			mIntent.putExtra("MODEL", mStringModel);

			mIntent.putExtra("LATITUDE", mStringLatitude);
			mIntent.putExtra("LONGITUDE", mStringLongitude);
			mIntent.putExtra("DAYTIME", mStringDayTime);
			mStringPingResult = mPingInfo.getResult();
			mIntent.putExtra("PINGRESULT", mStringPingResult);

			sendBroadcast(mIntent);
		}
	}

	@Override
	public void onLocationChanged(Location location) {
		// TODO 自動生成されたメソッド・スタブ

		/* 位置情報の取得判定 */
		if(location != null)
		{
			String strWork;
			strWork = (Double.toString(location.getLatitude()));	// 緯度
			if( strWork.length() > 0 ){
				mStringLatitude = strWork;
			}

			strWork = (Double.toString(location.getLongitude()));	// 緯度
			if( strWork.length() > 0 ){
				mStringLongitude = strWork;
			}
		}
	}

	@Override
	public void onProviderDisabled(String s) {
		// TODO 自動生成されたメソッド・スタブ
	}

	@Override
	public void onProviderEnabled(String s) {
		// TODO 自動生成されたメソッド・スタブ
	}

	@Override
	public void onStatusChanged(String s, int i, Bundle bundle) {
		// TODO 自動生成されたメソッド・スタブ
	}
}
